package core;

import java.util.ArrayList;

public class Statistics {

	private Model model;
	
	// We beginnen met 150 geld
	private int money = 150;
	
	private int level, kills, timerTeller;
	private ArrayList<TimeStats> stats = new ArrayList<TimeStats>();
	private long nextWave;
	
	// Tijd hoevaak we een snapshot van de stats moeten opslaan (voor grafiek)
	private static final double updateTime = 5;
	
	// Hoe lang heeft de speler voor een next wave
	private static final int nextWaveTime = 20;
	
	private String name, email;
	
	public Statistics( Model model ) {
		this.model = model;
		
		updateNextWave();
	}
	
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void updateNextWave() {
		nextWave = System.currentTimeMillis() + nextWaveTime * 1000;
	}
	
	/**
	 * Unpauzeerd de tijden in statistieken
	 */
	public void unpaused() {
		nextWave += System.currentTimeMillis();
	}
	
	/**
	 * Pauzeerd tijden
	 */
	public void paused() {
		// nextWave zal nu het aantal resterende milisec bevatten ipv absolute tijd
		nextWave -= System.currentTimeMillis();
	}
	
	/**
	 * @return aantal seconden tot next wave
	 */
	public int getNextWave(){
		return (int)(nextWave - System.currentTimeMillis()) / 1000;
	}
	
	public Model getModel(){
		return model;
	}
	
	public int getMoney(){
		return money;
	}
	
	public void incrementKills(){
		kills++;
	}
	
	public int getLevel(){
		return level;
	}
	
	public ArrayList getStats(){
		return stats;
	}
		
	public void setMoney(int money){
		this.money = money;
	}
	
	public void setLevel(int level){
		this.level = level;
	}

	/**
	 * @return the kills
	 */
	public int getKills() {
		return kills;
	}
	
	public void update() {
		timerTeller++;
		
		//Per tijd dat hij moet updaten de stats aanmaken
		if(timerTeller % (updateTime/Model.timerInterval) == 0) {
			makeStats();
			System.out.println("Timestats gemaakt");
		}
	}
	
	/**
	 * Maak een nieuwe TimeStats van de stats op dit moment, voor grafiek
	 */
	private void makeStats(){
		int score = 200;
		int damage = 200;
		int towerAmount = model.getTowers().size();
		
		stats.add( new TimeStats(level, score, money, towerAmount, model.getMap().getBase().getHealth(), damage, kills ) );
	}
	
	public void insertStats(){
		DB.DBspel.createConnection();
		int score = kills;
		int bestScore = DB.DBspel.getBestScore( model.getMap().getID());
		
		DB.DBspel.insertIntoSpel( this.name, this.email, model.getMap().getID(), score );
		
		//score = kills;
		System.out.println("p:" + model.getMap().getID() + ", "+  bestScore);
		if(  bestScore < score ){
			int tijd = 5;
			for( TimeStats t : stats ){
				//score berekenen
				score = kills; 
				DB.DBspel.insertIntoScore( t.getLevel(), tijd, t.getTower(), t.getBaseHealth(), score, t.getMoney(), t.getKills() );
				tijd += 5;
			}
			
		}
		DB.DBspel.shutdown();
	}
	
	public String[][] getHighScore(){
		DB.DBspel.createConnection();
		String[][] arr = DB.DBspel.getBest( model.getMap().getID() );		
		DB.DBspel.shutdown();
		return arr;
	}
	
	public void increaseMoney(int money) {
		this.money += money;
	}
	
	
	public void reduceMoney(int money) {
		this.money -= money;
	}

}
